        TITL DAI FIRMWARE C614-C7FA  V1.1
        ORG   :C614
*
*
*
****************************
* INPUT HEX NUMBER TO MACC *
****************************
*
* Reads a sequence of hex digits and converts
* them into MACC.
*
* Entry: C points to input.
* Exit:  CY=1: There was a digit.
*        CY=0: No digit.
*        C points to next input.
*        ABDEHL preserved.
*
HCB     STC
        PUSH  PSW
        PUSH  D
        PUSH  H
        CALL  :C598     Clear MACC and 00E3-E6
LC120   CALL  :C073     Get digit from line
        SUI   :30       )
        JC    :C590     )
        CPI   :0A       ) Check if hex number
        JC    :C634     )
        SUI   :07       ) Abort via C590 if not
        CPI   :0A       )
        JC    :C590     )
        CPI   :10       )
        JNC   :C590     )
LC121   LXI   H,:C63D   Addr INT(4)
        CALL  :C641     Insert digit at low end
 REM MACC
        JMP   :C61B     Get next digit
*
* DATA:
*
I4      DATA  :00       INT (4)
        DATA  :00
        DATA  :00
        DATA  :04
*
* ENTER HEX DIGIT AT LOW END MACC:
*
* Entry: HL points to a 4-byte number.
*        A  contains a digit.
* Exit:  HL = 00E3.
*        C is incremented, D decremented.
*        ABE preserved.
*
LC122   PUSH  PSW
        PUSH  B
        PUSH  D
        RST   4         Copy MACC to reg A,B,C,D
        DATA  :15
        ANI   :F0       Check if value too high
        CNZ   :C04B     Then overflow error
        POP   D
        POP   B
        POP   PSW
        RST   4         Shift left
        DATA  :6F
        JMP   :C5A7     Add digit to MACC
*
****************************************
* CONVERT HEX MACC TO ASCII FOR OUTPUT *
****************************************
*
* Converts a HEX number in MACC into its ASCII
* representation into the output buffer.
* Not significant leading zeroes are cancelled.
*
* Exit: BCDEHL preserved. AF corrupted.
*       Length output string in 00E3.
*       Output string in 00E4-00EB.
*
HBC     PUSH  B
        PUSH  D
        PUSH  H
        CALL  :C68D     Get startaddr DECBUF in HL
        RST   4         Copy MACC to reg A,B,C,D
        DATA  :15
        CALL  :C66A     Convert A,B to ASCII
 REM into DECBUF
        MOV   A,C
        MOV   B,D
        CALL  :C66A     Idem for C,D
        CALL  :C691     Get string length in 00E3
        POP   H
        POP   D
        POP   B
        RET
 REM
* Convert 2 hex digits:
 REM
LC123   CALL  :C66E     Convert 1st digit
        MOV   A,B       Get 2nd one
LC124   PUSH  PSW
        RAR
        RAR
        RAR
        RAR             Shift high nibble in low
        CALL  :C677     Convert it to ASCII
        POP   PSW       Restore both nibbles
LC125   ANI   :0F       Low nibble only
        CPI   :0A
        JC    :C680     If 0 < digit < 9
        ADI   :07       Add 7 for A < digit < F
LC126   ADI   :30       Convert to ASCII
        MOV   M,A       Into DECBUF
        INX   H         Incr pointer
        CPI   :30
        RNZ             Abort if digit <> 0
 REM
* If 1st digit is zero:
 REM
        MOV   A,L       Get lsbyte buffer pointer
        CPI   :E5       1st digit in buffer?
        RNZ             Abort if not
        DCX   H         Else: cancel non-sign. 0's
        RET
 REM
* Get startaddress output buffer:
 REM
LC127   LXI   H,:00E4   Startaddr in HL
        RET
*
* CALCULATE LENGTH OF STRING IN OUTPUT BUFFER:
*
* Entry: L: lobyte of address last digit in buffer.
* Exit:  BCDEHL preserved. AF corrupted.
*        Length is stored in 00E3.
*
LC128   MOV   A,L       Get lobyte addr last digit
        SUI   :E4       Minus beginaddr
        CPI   :01
        ACI   :00       Length min. 1
        STA   :00E3     Store length in DECBUF
        RET
*
*****************************************
* RESTORE A, ADD '.' AFTER DIGIT STRING *
*****************************************
*
* Part of PRTY (C486).
*
LC129   SUB   B         Restore A
        JMP   :C531     Move string left 1 pos,
 REM insert '.'
*
**************************************
* PRINT CHARACTER, INPUT A TEXT LINE *
**************************************
*
* Part of Run 'INPUT' (0E3D6).
*
* Entry: Character in A.
* Exit:  BC preserved.
*
PINPLN  PUSH  B
        CALL  :DD1F     Print char; input textline
        POP   B
        RET
*
        DATA  :FF
        DATA  :FF
*
*********************
* DATA FOR 'RANDOM' *
*********************
*
RNDA    DATA  :00       Random number constant A
        DATA  :00
        DATA  :00
        DATA  :3B
*
RNDB    DATA  :07       Random number constant B
        DATA  :73
        DATA  :59
        DATA  :41
*
IROR    DATA  :01       OR mask  (FPT (1))
        DATA  :80
        DATA  :00
        DATA  :00
*
*****************************
* part of READ BLOCK (D340) *
*****************************
*
* Exit if no loading errors.
*
MPT26   XTHL
        STC             CY=1: no error
LBK30   POP   H
        POP   D
        POP   B
        RET
*
*****************
* part of 2E8DE *
*****************
*
SPT02   CALL  :CE91     Go and set screen bits for
 REM mode 1
        JMP   :E138     (2) Pop all, ret.
*
*
*  ================
*** BANK SWITCHING ***
*  ================
*
*
*************************
* MATH. RESTART (RST 4) *
*************************
*
* This, and the following routines, switch the
* paged banks of ROM. They are entered via
* RST x; DATA xx instructions.
*
MARST   POP   H
        DI
        SHLD  :0043     Save HL
        PUSH  PSW
        POP   H
        SHLD  :0041     Save PSW
        MVI   H,:40     ROM bank 1 select bits
        LDA   :00D4     Offset of start HW/SW vector
*
* ROM BANK SWITCHING:
*
* This routine is generally used by all Restarts
* using ROM bank switching.
*
MRS10   XTHL
        ADD   M         Add entry number
        INX   H
        XTHL
        MOV   L,A       Complete entry point address
        LDA   :0040     Old bank select port status
        PUSH  PSW       Save it
        ANI   :3F       Keep other bits
        ORA   H         Add new select bits
        STA   :0040     Update memory
        STA   :FD06     Update port
        MVI   H,:E0
        CALL  :C6F2     Restore HL, PSW; switch bank
 REM
* Return from switched bank:
 REM
        XTHL            Return to old bank
        PUSH  PSW
        MOV   A,H       Get old bank
        STA   :0040     Reinstate memory
        STA   :FD06     Re-instate port
        POP   PSW
        POP   H
        RET             Return to caller
*
* SWITCH TO ROM BANK:
*
* HL and PSW are restored. On exit, the
* program switches to the selected ROM bank.
* After return from this bank, the program
* continues on C6E6.
*
MRDCL   PUSH  H
        LHLD  :0041
        PUSH  H
        POP   PSW       Restore A,F
        LHLD  :0043     Restore H,L
        EI
        RET             Switch to selected bank
*
**************************
* SCREEN RESTART (RST 5) *
**************************
*
* From SRS10 also used by RST 1.
*
SCRST   POP   H
        DI
        SHLD  :0043     Save HL
        PUSH  PSW
        MVI   A,:80     ROM bank 2 select bits
SRS10   POP   H
        SHLD  :0041     Save PSW
        MOV   H,A
        XRA   A
        JMP   :C6CF     Switch to new bank
*
**************************
* UTILITY/ENCODE (RST 1) *
**************************
*
UTRST   POP   H
        DI
        SHLD  :0043     Save HL
        PUSH  PSW
        MVI   A,:C0     ROM bank 3 select bits
        JMP   :C705     Switch to ROM bank 3
*
*
*  ===============
*** BASIC HANDLER ***
*  ===============
*
*
*********
* RESET *
*********
*
* BASIC entry point. Entry via hardware reset by
* means of a bootstrap on the addresslines to C000.
*
* This section is responsible for all 'once only'
* initialisation of the hardware and the software
* environment. It initialises pointers to all RAM
* areas required, the interrupt system and the
* software modules.
*
*INIT
RESET   LXI   SP,:F900  Init. stackpointer
        MVI   A,:30     ) cassette motors off;
        STA   :0040     ) paddle enable off;
        STA   :FD06     ) select ROM bank 0
        CALL  :D8FB     Init. interrupt system
        LXI   H,:0000
        SHLD  :02A3     Set for no Basic
        XRA   A
        STA   :0293     RNDLY=0
        NOP
        NOP
 REM
* Init. math.package:
 REM
        LXI   D,:C7F2   Addr table error vectors
        LXI   H,:DDE0   Addr routine get char/line
        CALL  :C003     Package initialisation
 REM
* Init. screen RAM:
 REM
        CALL  :C7FB     Check available RAM space
        DCX   H         Highest RAM address
        LXI   D,:C7E0   Addr screen default data
        RST   5
        DATA  :00       Init. screen RAM
 REM
* Init. I/O:
 REM
        XRA   A
        CALL  :EE8D     (0) Init. I/O switching
 REM (input keyb; output screen
 REM + RS232)
        STA   :0135     Input from keyboard for
 REM encoding
        MVI   A,:C0
        STA   :FFF5     Init. TICC baud rate
 REM
* Init. screen:
 REM
        CALL  :DAFF     Print 'DAI PERSONAL
        DBL   :C7A8     COMPUTER'
        LHLD  :02A5     Get bottom screen RAM
        LXI   D,:097B
        DAD   D         Get line mode byte of line
 REM with 'DAI pC'
        MVI   M,:5F     Set for medium resolution
        LXI   D,:FFD0
        DAD   D         Create new line mode byte
 REM for line with 'COMPUTER'
        CALL  :CEF9     Place 'COMPUTER' on new line
        MVI   D,:0F     Nr of blanking lines
HD10    CALL  :CECF     Blank next 15 lines
        DCR   D
        JNZ   :C768     Next line
 REM
* Prepare BASIC:
 REM
        CALL  :D72D     Init. Soundgen/DCEbus/
 REM transfer cassette data/
 REM set start HEAP/get evt.
 REM DCE-inputs
        LXI   H,:0100
        SHLD  :029D     HEAP size default value
        CALL  :DEB8     Run 'NEW'!
        MVI   A,:10
        STA   :013D     Select cassette port 1
        LXI   H,:E8C5   (3) Ptr. to ASCII table
        CALL  :D560     Init keyboard pointers
        CALL  :D101     Init string handler
*
*********
* RESET *
*********
*
* - Now switches off the volume of sound channel 2
*   during initialisation. This seems useless,
*   because in C76C all sound is already switched
*   off.
* - The header is changed to 'BASIC V1.1'
*
        STA   :01E4     ] Volume SCB2 = 0
        STA   :028F
        LXI   D,:0275
        LXI   H,:028F
        CALL  :DE7C
        EI
        RST   1
        DATA  :15
*
        LXI   H,:C7EE   Ptr. to mode 0 colours
        RST   5         Set text colours
        DATA  :06
 REM
* Entry from utility:
 REM
RINIT   CALL  :CEE4     Select ROM bank 0 and print
        DBL   :C7D3     'BASIC V1.0'
        JMP   :C818     Into BASIC monitor
*
* INITIALISATION SCREEN DATA:
*
MSGHDR  DATA  :0D       Frigged screen header
        DATA  :0D
        DATA  :0D
        DATA  :0D
        DATA  :0D
        DATA  :0D
        DATA  :20
        DATA  :44       D
        DATA  :41       A
        DATA  :49       I
        DATA  :20
        DATA  :50       P
        DATA  :45       E
        DATA  :52       R
        DATA  :53       S
        DATA  :4F       O
        DATA  :4E       N
        DATA  :41       A
        DATA  :4C       L
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :20
        DATA  :43       C
        DATA  :4F       O
        DATA  :4D       M
        DATA  :50       P
        DATA  :55       U
        DATA  :54       T
        DATA  :45       E
        DATA  :52       R
        DATA  :0D
        DATA  :00
*
MSGIN   DATA  :0C
        DATA  :42       B
        DATA  :41       A
        DATA  :53       S
        DATA  :49       I
        DATA  :43       C
        DATA  :20
        DATA  :56       V
        DATA  :31       1
        DATA  :2E       .
        DATA  :31       ] Header changed to V1.1
        DATA  :0D
        DATA  :00
*
* SCREEN INITIALISATION PARAMETERS:
*
SIPAR   DATA  :01       Default cursor type
        DATA  :5F       Default cursor ASCII value
*
        DATA  :05       )
        DATA  :0F       ) Colours COLORT
        DATA  :0F       ) during Reset
        DATA  :05       )
*
        DATA  :00       )
        DATA  :05       ) Default colours
        DATA  :0A       ) COLORG
        DATA  :0F       )
*
        DBL   :CA01     Addr. memory management
 REM routine
        DBL   :CA25     Addr. emergency stop routine
*
STCOL   DATA  :08       )
        DATA  :00       ) Default colours
        DATA  :00       ) COLORT
        DATA  :08       )
*
* MATH. ERROR ROUTINE VECTORS:
*
MEVEC   DBL   :DA1F     Addr. Overflow error routine
        DBL   :DA15     Addr. Number out of range
 REM error routine
        DBL   :C7FA     Addr. Return
        DBL   :DA24     Addr. Error routine Division
 REM by zero
*
MERET   RET             Return
*
*
*
        UNL
INIT    EQU RESET
        LST
        END
